{{^extendedByOtherShape}}
    private {{className}}(Builder{{#typeParameters}}{{.}}{{/typeParameters}} builder) {
{{/extendedByOtherShape}}
{{#extendedByOtherShape}}
    protected {{className}}(AbstractBuilder<{{#typeParameters}}{{#typeParameterDefinitions}}{{.}}, {{/typeParameterDefinitions}}{{/typeParameters}}?> builder) {
{{/extendedByOtherShape}}
        {{>ObjectShape/ConstructorImpl}}
    }
{{^abstract}}

    public static{{#typeParameters}} {{.}}{{/typeParameters}} {{selfType}} {{#extendedByOtherShape}}{{#camelCase}}{{className}}{{/camelCase}}Of{{/extendedByOtherShape}}{{^extendedByOtherShape}}of{{/extendedByOtherShape}}({{selfType.builderFnType}} fn) {
        return fn.apply(new Builder{{#typeParameters}}<>{{/typeParameters}}()).build();
    }
{{/abstract}}